package Day_0216.JVM.GarbageCollection;

/**
 * @author zxc
 * @date 2023/02/16 18:02
 **/
public class Set_Methodarea_Memory {
    public static void main(String[] args) {
        /**
         * 设置方法区内存空间大小的方法
         * ===》
         * 1.方法区的大小不是固定的，JVM可以根据应用的需要进行动态调整。
         *
         * 2.JDK7及之前：
         * ===》即，方法区的实现是永久代（PermGen），永久代的内存大小是受到虚拟机内存大小限制的;
         * （1）通过 -XX:Permsize 来设置永久代的初始分配空间，默认值是20.75M。
         * （2）通过 -XX:MaxPermsize 来设置永久代的最大可分配空间，32位机器默认是64M，64位机器模式是82M。
         * （3）当JVM加载的类信息容量超过所设置的最大值，会报异常OutOfMemoryError: PermGen space。
         *
         * 3.JDK8及之后：
         * （1）通过设置参数 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 来设置元空间的初始分配空间和最大可分配空间。
         * （2）上述参数的默认值依赖于平台，Windows系统下，-XX:MetaspaceSize是21M，-XX:MaxMetaspaceSize的值是-1，即没有限制。
         * （3）如果不指定元空间大小，使用默认值，方法区可能耗尽所有的可用系统内存。
         *  如果元空间发生溢出，虚拟机会抛出异常OutOfMemoryError:Metaspace。
         * （4）通过-XX:Metaspacesize设置的初始元空间大小是一个初始的高水位线，
         *  一旦触及这个水位线，FullGC将会被触发并卸载不再使用的类，然后这个高水位线将会重置。
         *  新的高水位线的值取决于GC后释放了多少元空间，
         *  如果释放的空间不足，那么在不超过 MaxMetaspaceSize时，适当提高该值。
         *  如果释放空间过多，则适当降低该值。
         *  ===》
         *  所以，如果初始化的高水位线设置过低，高水位线调整情况会发生很多次，通过垃圾回收器的日志，可以观察到Full GC多次调用。
         *  为了避免频繁Full GC，建议将-XX:MetaspaceSize设置为一个相对较高的值。
         *
         */
    }
}
